from langchain_core.output_parsers import JsonOutputParser, PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate
from loguru import logger
from pydantic import Field, BaseModel, field_validator

from a0base.base_llm import pop_llm


class Product(BaseModel):
    """
    产品信息模型类，用于定义产品的结构化数据格式

    属性:
        name (str): 产品名称
        category (str): 产品类别
        description (str): 产品简介，长度必须大于等于10个字符
    """
    name: str = Field(description="产品名称")
    category: str = Field(description="产品类别")
    description: str = Field(description="产品简介")

    @field_validator("description")
    def validate_description(cls, value):
        """
        验证产品简介字段的长度

        参数:
            value (str): 待验证的产品简介文本

        返回:
            str: 验证通过的产品简介文本

        异常:
            ValueError: 当产品简介长度小于10个字符时抛出
        """
        if len(value) < 10:
            raise ValueError('产品简介长度必须大于等于10')
        return value

# 1-创建Pydantic输出解析器实例，用于解析模型输出为Product对象- 获取格式化指令，用于指导模型输出符合Product模型的JSON格式
parser = PydanticOutputParser(pydantic_object=Product)
format_instructions = parser.get_format_instructions()

# 2-创建聊天提示模板，包含系统角色设定和用户问题输入
chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个AI助手，你只能输出结构化JSON数据。"),
    ("human", "请生成一个关于{topic}的新闻。{format_instructions}")
])

# 3-使用指定的角色和问题生成具体的提示内容
prompt = chat_prompt.format_messages(topic="小米", format_instructions=format_instructions)
logger.info(prompt)

# 调用模型获取回答结果
response = pop_llm.invoke(prompt)
logger.info(f"解析后的结构化结果:\n{response}")

# 打印类型
logger.info(f"结果类型: {type(response)}")
